//
// Created by yanhai on 2021/1/10.
//

/**
 * 链表反转
 */

#include <stdio.h>
#include "link_common.h"

/**
 * 链表反转
 * 原理：使用变量 prev p next 分别指向当前节点的前一个  当前节点  当前节点的后一个
 *      反转p节点，让它的next指向prev，然后3个指针向后平移
 * @param T
 */
void link_reverse(link *T)
{
    link_node *prev = NULL;
    link_node *p = T->root;
    link_node *next;

    while (p != NULL) {
        next = p->next; // 防止链表断裂
        p->next = prev; // 反转当前节点
        prev = p;       // prev后移
        p = next;       // p后移
    }
    // 此时p为NULL，那么它前面的节点就是头节点
    T->root = prev;
}

int main()
{
    link T = link_create_from_index(20, false);
    link_print(&T);

    link_reverse(&T);

    printf("\n=== 反转后\n");
    link_print(&T);

    link_destroy(&T);
    return 0;
}
